//package at.ac.tuwien.infosys.dsg.daiosPlugins.axis2.axiom;
//
//import java.io.IOException;
//import java.lang.reflect.Array;
//import java.util.Iterator;
//import java.util.LinkedList;
//import java.util.List;
//import java.util.logging.Logger;
//
//import org.apache.axiom.om.OMAbstractFactory;
//import org.apache.axiom.om.OMElement;
//import org.apache.axiom.om.OMNamespace;
//import org.apache.axiom.om.OMNode;
//
//import at.ac.tuwien.infosys.dsg.daios.exceptions.ArrayException;
//import at.ac.tuwien.infosys.dsg.daios.exceptions.TypeErrorException;
//import at.ac.tuwien.infosys.dsg.daios.exceptions.UnsupportedClassException;
//import at.ac.tuwien.infosys.dsg.daios.framework.interfaces.IConstants;
//import at.ac.tuwien.infosys.dsg.daios.framework.structs.DaiosInputMessage;
//import at.ac.tuwien.infosys.dsg.daios.framework.structs.DaiosMessage;
//import at.ac.tuwien.infosys.dsg.daios.framework.structs.DaiosOutputMessage;
//import at.ac.tuwien.infosys.dsg.daios.wsdl.AtomicTypesMapper;
//import at.ac.tuwien.infosys.dsg.daios.wsdl.interfaces.IWSDLType;
//import at.ac.tuwien.infosys.dsg.daios.wsdl.interfaces.IWSDLMessage;
//import at.ac.tuwien.infosys.dsg.daios.wsdl.interfaces.IWSDLOperation;
//import at.ac.tuwien.infosys.dsg.daios.wsdl.interfaces.IWSDLPart;
//import at.ac.tuwien.infosys.dsg.daios.wsdl.typesystem.WSDLTypeTree;
//import at.ac.tuwien.infosys.dsg.daiosPlugins.nativeInvoker.converter.SOAPDocConverter;
//
//public class OMDocLitConverter extends OMElementConverter {
//	
//	private List<IWSDLType> returnParts = null;
//	
//	private OMDocLitConverter(IWSDLMessage output, WSDLTypeTree types) {
//		log = Logger.getLogger(IConstants.LOG_NAME);
//		fac = OMAbstractFactory.getOMFactory();
//		
//		// check if we have a oneway invocation
//		if(output == null)
//			return;
//		
//		List<IWSDLPart> l = output.getParts();
//		returnParts = new LinkedList<IWSDLType>();
//		for(IWSDLPart p : l) {
//			returnParts.add(types.getGlobalElement(p.getPartType()));
//		}
//		
//	}
//	
//	private OMDocLitConverter(List<IWSDLType> returnParts) {
//		log = Logger.getLogger(IConstants.LOG_NAME);
//		fac = OMAbstractFactory.getOMFactory();
//		this.returnParts = returnParts;
//	}
//	
//	protected static OMDocLitConverter getInstance(IWSDLMessage output,
//			WSDLTypeTree types) {
//		return new OMDocLitConverter(output, types);
//	}
//	
//	public List<OMElement> convert(IWSDLOperation op, IWSDLMessage msg,
//			DaiosInputMessage actualMsg, WSDLTypeTree types) {
//		
//		throw new RuntimeException("Not yet implemented");
//		
//	}
//
//	public DaiosOutputMessage convert(List<OMElement> returnMessage) {
//
//		return convert(returnMessage, 0);
//		
//	}
//	
//	
//	public DaiosOutputMessage convert(List<OMElement> returnMessage, int seqNr) {
//		
//		throw new RuntimeException("Not yet implemented");
//		
//	}
//	
//	public DaiosOutputMessage convertAsync(List<OMElement> result) {
//		
//		// we have to go to the body ...
//		Iterator it = result.getChildElements();
//		OMElement next = null;
//		while(it.hasNext()) {
//			next = (OMElement)it.next();
//			if(next.getQName().getLocalPart().equalsIgnoreCase("Body"))
//				break;
//		}
//		
//		// and down another level ...
//		it = next.getChildElements();
//		next = (OMElement)it.next();
//		
//		// now we can reuse the standard OM converter logic
//		return convert(next, 0);
//		
//	}
//
//	private void extractSimpleValue(DaiosOutputMessage m,
//			OMElement el, int seqNr) {
//		
//		try {
//			
//			String type =
//				wrapperType.getSequence()[seqNr].getTypeName().getLocalPart();
//			String val = el.getText();
//			Class vClass = AtomicTypesMapper.get(type);
//			Object castedVal
//				= AtomicTypesMapper.construct(val,vClass);
//			
//			m.set(el.getLocalName(),castedVal,vClass);
//			
//		} catch (IOException e) {
//			log.severe("Internal Daios error while processing the "+
//				"server response.");
//			e.printStackTrace();
//		} catch (UnsupportedClassException e) {
//			log.severe("Internal Daios error while processing the "+
//				"server response.");
//			e.printStackTrace();
//		} catch (TypeErrorException e) {
//			log.severe("Internal Daios error while processing the "+
//				"server response.");
//			e.printStackTrace();
//		} catch (ArrayException e) {
//			log.severe("Internal Daios error while processing the "+
//				"server response.");
//			e.printStackTrace();
//		}
//		
//	}
//	
//	private int extractArrayValues(DaiosOutputMessage m,
//			OMElement el, int seqNr) {
//		
//		List<String> l = new LinkedList<String>();
//		
//		String type =
//			wrapperType.getSequence()[seqNr].getTypeName().getLocalPart();
//		String name = el.getLocalName();
//
//		int elCounter = 0;
//		
//		// get all array values in a list
//		for(OMElement e = el; e != null && e.getLocalName().equals(name);
//			e = OMUtil.getNextOMElement(e)) {
//			
//			elCounter++;
//			
//			String val = e.getText();
//			
//			// ignore empty array values
//			if(val == null || val.trim().equals(""))
//				continue;
//			
//			l.add(val);
//		}
//		
//		// now add this array to the message
//		try {
//			m.set(name, convert(l, type),
//				AtomicTypesMapper.getArray(type));
//		} catch (TypeErrorException e) {
//			log.severe("Internal Daios error while processing the "+
//				"server response.");
//			e.printStackTrace();
//		} catch (ArrayException e) {
//			log.severe("Internal Daios error while processing the "+
//				"server response.");
//			e.printStackTrace();
//		}
//		
//		// return the number of elements we have used
//		// (so that they are not used again)
//		return elCounter;
//	}
//	
//	private int extractComplexArrayValues(DaiosOutputMessage m,
//			OMElement el, int seqNr) {
//		
//		List<DaiosMessage> l = new LinkedList<DaiosMessage>();
//		
//		String name = el.getLocalName();
//		
//		int elCounter = 0;
//		
//		// get all array values in a list
//		DaiosMessage val = null;
//		OMDocLitConverter converter = new OMDocLitConverter(
//			wrapperType.getSequence()[seqNr]);
//		for(OMElement e = el; e != null && e.getLocalName().equals(name);
//			e = OMUtil.getNextOMElement(e)) {
//			elCounter++;
//			val = converter.convert(e, 0);
//			l.add(val);
//		}
//		
//		// now add this array to the message
//		try {
//			m.setComplexArray(name, convert(l));
//		} catch (ArrayException e) {
//			log.severe("Internal Daios error while processing the "+
//				"server response.");
//			e.printStackTrace();
//		}
//		
//		// return the number of elements we have used
//		// (so that they are not used again)
//		return elCounter;
//		
//	}
//	
//	private void extractComplexValue(DaiosOutputMessage m,
//			OMElement el, int seqNr) {
//		// recursively go deeper
//		OMDocLitConverter converter = new OMDocLitConverter(
//			wrapperType.getSequence()[seqNr]);
//		m.setComplex(el.getLocalName(), converter.convert(el, 0));
//	}
//
//	private boolean checkIfSimple(OMElement el) {
//		
//		if(el.getFirstElement() != null)
//			return false;
//		
//		if(el.getAllAttributes().hasNext())
//			return false;
//		
//		return true;
//		
//	}
//	
//	/**
//	 * We assume that an element is an array type if it either
//	 * has a previous or a next sibling with the same local name.
//	 * 
//	 * @param el The Element to check.
//	 * @return True if this is an array type, false oterwise.
//	 */
//	private boolean checkIfArray(OMElement el) {
//		
//		String name = el.getLocalName();
//		
//		OMElement previous = OMUtil.getPreviousOMElement(el);
//		if(previous != null && previous.getLocalName().equals(name))
//			return true;
//		
//		OMElement next = OMUtil.getNextOMElement(el);
//		if(next != null && next.getLocalName().equals(name))
//			return true;
//		
//		return false;
//	}
//	
//}
